home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume13 / gmcalc / part13 < prev    next >
Encoding:
Text File  |  1990-06-05  |  57.3 KB  |  1,749 lines

  1. Newsgroups: comp.sources.misc
  2. From: daveg@csvax.caltech.edu (David Gillespie)
  3. Subject: v13i039: Emacs Calculator 1.01, part 13/19
  4. Sender: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  5.  
  6. Posting-number: Volume 13, Issue 39
  7. Submitted-by: daveg@csvax.caltech.edu (David Gillespie)
  8. Archive-name: gmcalc/part13
  9.  
  10. ---- Cut Here and unpack ----
  11. #!/bin/sh
  12. # this is part 13 of a multipart archive
  13. # do not concatenate these parts, unpack them in order with /bin/sh
  14. # file calc.texinfo continued
  15. #
  16. CurArch=13
  17. if test ! -r s2_seq_.tmp
  18. then echo "Please unpack part 1 first!"
  19.      exit 1; fi
  20. ( read Scheck
  21.   if test "$Scheck" != $CurArch
  22.   then echo "Please unpack part $Scheck next!"
  23.        exit 1;
  24.   else exit 0; fi
  25. ) < s2_seq_.tmp || exit 1
  26. echo "x - Continuing file calc.texinfo"
  27. sed 's/^X//' << 'SHAR_EOF' >> calc.texinfo
  28. Xyour direction of motion is -64 degrees from horizontal.  Suppose
  29. Xwe move in the opposite direction, up and to the left:
  30. X
  31. X@group
  32. X@example
  33. X2:  -0.89879   2:  0.89879    1:  -2.0503    1:  -64.
  34. X1:  0.43837    1:  -0.43837       .              .
  35. X    .              .
  36. X
  37. X   U U           M-2 n            /             I T
  38. X@end example
  39. X@end group
  40. X
  41. XHow can the angle be the same?  The answer is that the @kbd{/} operation
  42. Xloses information about the signs of its inputs.  Because the quotient
  43. Xis negative, we know exactly one of the inputs was negative, but we
  44. Xcan't tell which one.  There is an @code{arctan2} function which
  45. Xcomputes the inverse tangent of the quotient of a pair of numbers.
  46. XSince you feed it the two original numbers, it has enough information
  47. Xto give you a full 360-degree answer.
  48. X
  49. X@group
  50. X@example
  51. X2:  0.89879    1:  116.       3:  116.       2:  116.       1:  180.
  52. X1:  -0.43837       .          2:  -0.89879   1:  -64.           .
  53. X    .                         1:  0.43837        .
  54. X                                  .
  55. X
  56. X   U U          x arctan2       X M-2 n       x arctan2         -
  57. X@end example
  58. X@end group
  59. X
  60. XThe resulting angles differ by 180 degrees; in other words, they
  61. Xpoint in opposite directions, just as we would expect.
  62. X
  63. XThe shift-@kbd{X} we used in the third step is the ``last-X'' command.
  64. XIt is sort of like Undo, except that it restores the arguments of the
  65. Xlast command to the stack without removing the command's result.  It
  66. Xis useful in situations like we have here, where we need to do
  67. Xseveral operations on the same inputs.  We could have accomplished
  68. Xthe same thing by using @kbd{M-2 @key{RET}} to duplicate the top two
  69. Xstack elements right after the @kbd{U U}, then a pair of @kbd{M-@key{TAB}}
  70. Xcommands to cycle the 116 up around the duplicates.
  71. X
  72. XA similar identity is supposed to hold for hyperbolic sines and cosines,
  73. Xexcept that it is the @emph{difference}
  74. X@samp{cosh(@var{x})^2 - sinh(@var{x})^2} that always equals one.
  75. XLet's try to verify this identity.@refill
  76. X
  77. X@group
  78. X@example
  79. X2:  -64        2:  -64        2:  -64        2:  9.7192e54  2:  9.7192e54
  80. X1:  -64        1:  -3.1175e27 1:  9.7192e54  1:  -64        1:  9.7192e54
  81. X    .              .              .              .              .
  82. X
  83. X 64 n RET RET      H C           2 ^            TAB           H S 2 ^
  84. X@end example
  85. X@end group
  86. X
  87. XSomething's obviously wrong, because when we subtract these numbers
  88. Xthe answer will clearly be zero!  But if you think about it, if these
  89. Xnumbers @emph{did} differ by one, it would be in the 55th decimal
  90. Xplace.  The difference we seek has been lost entirely to roundoff
  91. Xerror.
  92. X
  93. XWe could verify this hypothesis by doing the actual calculation with,
  94. Xsay, 60 decimal places of precision.  This will be slow, but not
  95. Xenormously so.  Try it if you wish; sure enough, the answer is
  96. X0.99999, reasonably close to 1.
  97. X
  98. XOf course, a more reasonable way to verify the identity is to use
  99. Xa more reasonable value for @var{x}!
  100. X
  101. XSome Calculator commands use the Hyperbolic prefix for other purposes.
  102. XThe logarithm and exponential functions, for example, work to the base
  103. X@samp{e} normally but use base-10 instead if you use the Hyperbolic
  104. Xprefix.
  105. X
  106. X@group
  107. X@example
  108. X1:  1000       1:  6.9077     1:  1000       1:  3.
  109. X    .              .              .              .
  110. X
  111. X    1000           L              U              H L
  112. X@end example
  113. X@end group
  114. X
  115. XFirst, we mistakenly compute a natural logarithm.  Then we undo
  116. Xand compute a common logarithm instead.
  117. X
  118. XThe @kbd{B} key computes a general base-@var{b} logarithm for any
  119. Xvalue of @var{b}.
  120. X
  121. X@group
  122. X@example
  123. X2:  1000       1:  3.         1:  1000.      2:  1000.      1:  6.9077
  124. X1:  10             .              .          1:  2.71828        .
  125. X    .                                            .
  126. X
  127. X 1000 RET 10       B             H E            H P             B
  128. X@end example
  129. X@end group
  130. X
  131. XHere we first use @kbd{B} to compute the base-10 logarithm, then use
  132. Xthe ``hyperbolic'' exponential as a cheap hack to recover the number
  133. X1000, then use @kbd{B} again to compute the natural logarithm.  Note
  134. Xthat @kbd{P} with the hyperbolic prefix pushes the constant @samp{e}
  135. Xonto the stack.
  136. X
  137. XThe Calculator also has a set of functions relating to combinatorics
  138. Xand statistics.  You may be familiar with the @dfn{factorial} function,
  139. Xwhich computes the product of all the integers up to a given number.
  140. X
  141. X@group
  142. X@example
  143. X1:  100        1:  93326215443...    1:  100.       1:  9.3326e157
  144. X    .              .                     .              .
  145. X
  146. X    100            !                     U c f          !
  147. X@end example
  148. X@end group
  149. X
  150. XThe @kbd{c f} command converts the integer or fraction at the top
  151. Xof the stack to floating-point format.  If you take the factorial
  152. Xof a floating-point number, you get a floating-point result
  153. Xaccurate to the current precision.  But if you give @kbd{!} an
  154. Xexact integer, you get an exact integer result (158 digits long
  155. Xin this case).
  156. X
  157. XIf you take the factorial of a non-integer, Calc uses the generalized
  158. Xfactorial function defined in terms of Euler's Gamma function.
  159. X
  160. X@group
  161. X@example
  162. X3:  4.         3:  24.               1:  5.5        1:  52.342777846
  163. X2:  4.5        2:  52.3427777846         .              .
  164. X1:  5.         1:  120.
  165. X    .              .
  166. X
  167. X                   M-3 !              M-0 DEL 5.5      x gamma
  168. X@end example
  169. X@end group
  170. X
  171. XHere we verify the identity @samp{@var{n}! = gamma(@var{n}+1)}.
  172. X
  173. XThe binomial coefficient @var{n}-choose-@var{m} can be defined as
  174. X@samp{@var{n}! / @var{m}! (@var{n}-@var{m})!} for all reals @var{n} and
  175. X@var{m}.  The intermediate results in this formula can become quite
  176. Xlarge even if the result is small; the @kbd{k b} command computes
  177. Xa binomial coefficient in a way that avoids large intermediate
  178. Xvalues.
  179. X
  180. XThe @kbd{k} prefix key defines several common functions out of
  181. Xcombinatorics and number theory.  Here we compute the binomial
  182. Xcoefficient 30-choose-20, then determine its prime factorization.
  183. X
  184. X@group
  185. X@example
  186. X2:  30         1:  30045015   1:  [3, 3, 5, 7, 11, 13, 23, 29]
  187. X1:  20             .              .
  188. X    .
  189. X
  190. X 30 RET 20        k b            k f
  191. X@end example
  192. X@end group
  193. X
  194. XYou can verify these prime factors by using @kbd{v u} to ``unpack''
  195. Xthis vector into 8 separate stack entries, then @kbd{M-8 *} to
  196. Xmultiply them back together.  The result is the original number,
  197. X30045015.
  198. X
  199. XSuppose a program you are writing needs a hash table with at least
  200. X10000 entries.  It's best to use a prime number as the actual size
  201. Xof a hash table.  Calc can compute the next prime number after 10000:
  202. X
  203. X@group
  204. X@example
  205. X1:  10000      1:  10007      1:  9973
  206. X    .              .              .
  207. X
  208. X    10000          k n           I k n
  209. X@end example
  210. X@end group
  211. X
  212. XJust for kicks we've also computed the next prime @emph{less} than
  213. X10000.
  214. X
  215. X@node Vector/Matrix Tutorial, Types Tutorial, Arithmetic Tutorial, Tutorial
  216. X@section Vector/Matrix Tutorial
  217. X
  218. XA @dfn{vector} is a list of numbers or other Calc data objects.
  219. XCalc provides a large set of commands that operate on vectors.  Some
  220. Xare familiar operations from vector analysis.  Others simply treat
  221. Xa vector as a list of objects.
  222. X
  223. X@menu
  224. X* Vector Analysis Tutorial::
  225. X* Matrix Tutorial::
  226. X* List Tutorial::
  227. X@end menu
  228. X
  229. X@node Vector Analysis Tutorial, Matrix Tutorial, Vector/Matrix Tutorial, Vector/Matrix Tutorial
  230. X@subsection Vector Analysis
  231. X
  232. XIf you add two vectors, the result is a vector of the sums of the
  233. Xelements, taken pairwise.
  234. X
  235. X@group
  236. X@example
  237. X1:  [1, 2, 3]     2:  [1, 2, 3]     1:  [8, 8, 3]
  238. X    .             1:  [7, 6, 0]         .
  239. X                      .
  240. X
  241. X  [1,2,3] s 1       [7 6 0] s 2         +
  242. X@end example
  243. X@end group
  244. X
  245. XNote that we can separate the vector elements with either commas or
  246. Xspaces.  This is true whether we are using incomplete vectors or
  247. Xalgebraic entry.
  248. X
  249. XIf you multiply two vectors, the result is the sum of the products
  250. Xof the elements taken pairwise.  This is called the @dfn{dot product}
  251. Xof the vectors.
  252. X
  253. X@group
  254. X@example
  255. X2:  [1, 2, 3]     1:  19
  256. X1:  [7, 6, 0]         .
  257. X    .
  258. X
  259. X    r 1 r 2           *
  260. X@end example
  261. X@end group
  262. X
  263. XThe dot product of two vectors is equal to the product of their
  264. Xlengths times the cosine of the angle between them.  (Here the vector
  265. Xis interpreted as a line from the origin @samp{(0,0,0)} to the
  266. Xspecified point in three-dimensional space.)  The @kbd{A}
  267. X(absolute value) command can be used to compute the length of a
  268. Xvector.
  269. X
  270. X@group
  271. X@example
  272. X3:  19            3:  19          1:  0.550782    1:  56.579
  273. X2:  [1, 2, 3]     2:  3.741657        .               .
  274. X1:  [7, 6, 0]     1:  9.219544
  275. X    .                 .
  276. X
  277. X    X                 M-2 A          * /             I C
  278. X@end example
  279. X@end group
  280. X
  281. XFirst we recall the arguments to the dot product command, then
  282. Xwe compute the absolute values of the top two stack entries to
  283. Xobtain the lengths of the vectors, then we divide the dot product
  284. Xby the product of the lengths to get the cosine of the angle.
  285. XThe inverse cosine finds that the angle between the vectors
  286. Xis about 56 degrees.
  287. X
  288. XThe @dfn{cross product} of two vectors is a vector whose length
  289. Xis the product of the lengths of the inputs times the sine of the
  290. Xangle between them, and whose direction is perpendicular to both
  291. Xinput vectors.  Unlike the dot product, the cross product is
  292. Xdefined only for three-dimensional vectors.  Let's double-check
  293. Xour computation of the angle using the cross product.
  294. X
  295. X@group
  296. X@example
  297. X2:  [1, 2, 3]  3:  [-18, 21, -8]  1:  [-0.52, 0.61, -0.23]  1:  56.579
  298. X1:  [7, 6, 0]  2:  [1, 2, 3]          .                         .
  299. X    .          1:  [7, 6, 0]
  300. X                   .
  301. X
  302. X    r 1 r 2       V C s 3 X           M-2 A * /                 A I S
  303. X@end example
  304. X@end group
  305. X
  306. XVector-related commands generally begin with the @kbd{v} prefix key.
  307. XSome are uppercase letters and some are lowercase.  To make it easier
  308. Xto type these commands, the shift-@kbd{V} key acts the same as the
  309. X@kbd{v} prefix.
  310. X
  311. XFirst we recall the original vectors and compute their cross product,
  312. Xwhich we also store for later reference.  Now we divide the vector
  313. Xby the product of the lengths of the original vectors.  The length of
  314. Xthis vector should be the sine of the angle; sure enough, it is!
  315. X
  316. XIf we take the dot product of two perpendicular vectors we expect
  317. Xto get zero, since the cosine of 90 degrees is zero.  Let's check
  318. Xthat the cross product is indeed perpendicular to both inputs:
  319. X
  320. X@group
  321. X@example
  322. X2:  [1, 2, 3]      1:  0          2:  [7, 6, 0]      1:  0
  323. X1:  [-18, 21, -8]      .          1:  [-18, 21, -8]      .
  324. X    .                                 .
  325. X
  326. X    r 1 r 3            *          DEL r 2 r 3            *
  327. X@end example
  328. X@end group
  329. X
  330. X@node Matrix Tutorial, List Tutorial, Vector Analysis Tutorial, Vector/Matrix Tutorial
  331. X@subsection Matrices
  332. X
  333. XA @dfn{matrix} is just a vector of vectors, all the same length.
  334. XThis means you can enter a matrix using nested brackets.  You can
  335. Xalso use the semicolon character to enter a matrix.  We'll show
  336. Xboth methods here:
  337. X
  338. X@group
  339. X@example
  340. X1:  [ [ 1, 2, 3 ],            1:  [ [ 1, 2, 3 ],
  341. X      [ 4, 5, 6 ] ]                 [ 4, 5, 6 ] ]
  342. X    .                             .
  343. X
  344. X  [[1 2 3] [4 5 6]]             ' [1 2 3; 4 5 6] RET
  345. X@end example
  346. X@end group
  347. X
  348. XWe'll be using this matrix again, so type @kbd{s 4} to save it now.
  349. X
  350. XNote that semicolons work with incomplete vectors, but they work
  351. Xbetter in algebraic entry.  That's why we use the apostrophe in
  352. Xthe second example.
  353. X
  354. XWhen two matrices are multiplied, the lefthand matrix must have
  355. Xthe same number of columns as the righthand matrix has rows.
  356. XRow @var{i}, column @var{j} of the result is effectively the
  357. Xdot product of row @var{i} of the left matrix by column @var{j}
  358. Xof the right matrix.
  359. X
  360. XIf we try to duplicate this matrix and multiply it by itself,
  361. Xthe dimensions are wrong and the multiplication cannot take place:
  362. X
  363. X@group
  364. X@example
  365. X1:  [ [ 1, 2, 3 ],  * [ [ 1, 2, 3 ],
  366. X      [ 4, 5, 6 ] ]     [ 4, 5, 6 ] ]
  367. X    .
  368. X
  369. X    RET *
  370. X@end example
  371. X@end group
  372. X
  373. XThough rather hard to read, this is a formula which shows the product
  374. Xof two matrices.  The @samp{*} function, having invalid arguments, has
  375. Xbeen left in symbolic form.
  376. X
  377. XWe can multiply the matrices if we @dfn{transpose} one of them first.
  378. X
  379. X@group
  380. X@example
  381. X2:  [ [ 1, 2, 3 ],      1:  [ [ 14, 32 ],     1:  [ [ 17, 22, 27 ],
  382. X      [ 4, 5, 6 ] ]           [ 32, 77 ] ]          [ 22, 29, 36 ],
  383. X1:  [ [ 1, 4 ],             .                       [ 27, 36, 45 ] ]
  384. X      [ 2, 5 ],                                   .
  385. X      [ 3, 6 ] ]
  386. X    .
  387. X
  388. X    U v t                   *                     U TAB *
  389. X@end example
  390. X@end group
  391. X
  392. XMatrix multiplication is not commutative; indeed, switching the
  393. Xorder of the operands can even change the dimensions of the result
  394. Xmatrix, as happened here!
  395. X
  396. XIf you multiply a plain vector by a matrix, it is treated as a
  397. Xsingle row or column depending on which side of the matrix it is
  398. Xon.  The result is a plain vector which should also be interpreted
  399. Xas a row or column as appropriate.
  400. X
  401. X@group
  402. X@example
  403. X2:  [ [ 1, 2, 3 ],     1:  [14, 32]
  404. X      [ 4, 5, 6 ] ]        .
  405. X1:  [1, 2, 3]
  406. X    .
  407. X
  408. X    r 4 r 1                *
  409. X@end example
  410. X@end group
  411. X
  412. XMultiplying in the other order wouldn't work because the number of
  413. Xrows in the matrix is different from the number of elements in the
  414. Xvector.
  415. X
  416. XAn @dfn{identity matrix} is a square matrix with ones along the
  417. Xdiagonal and zeros elsewhere.  It has the property that multiplication
  418. Xby an identity matrix, on the left or on the right, always produces
  419. Xthe original matrix.
  420. X
  421. X@group
  422. X@example
  423. X1:  [ [ 1, 2, 3 ],     2:  [ [ 1, 2, 3 ],     1:  [ [ 1, 2, 3 ],
  424. X      [ 4, 5, 6 ] ]          [ 4, 5, 6 ] ]          [ 4, 5, 6 ] ]
  425. X    .                  1:  [ [ 1, 0, 0 ],         .
  426. X                             [ 0, 1, 0 ],
  427. X                             [ 0, 0, 1 ] ]
  428. X                           .
  429. X
  430. X    r 4                    v i 3 RET              *
  431. X@end example
  432. X@end group
  433. X
  434. XIf a matrix is square, it is often possible to find its @dfn{inverse},
  435. Xthat is, a matrix which, when multiplied by the original matrix, yields
  436. Xan identity matrix.  The @kbd{&} (reciprocal) key also computes the
  437. Xinverse of a matrix.
  438. X
  439. X@group
  440. X@example
  441. X1:  [ [ 1, 2, 3 ],     1:  [ [   -2.4,     1.2,   -0.2 ],
  442. X      [ 4, 5, 6 ],           [    2.8,    -1.4,    0.4 ],
  443. X      [ 7, 6, 0 ] ]          [ -0.73333, 0.53333, -0.2 ] ]
  444. X    .                      .
  445. X
  446. X    r 4 r 2 | s 5          &
  447. X@end example
  448. X@end group
  449. X
  450. XThe vertical bar @kbd{|} @dfn{concatenates} numbers, vectors, and
  451. Xmatrices together.  Here we have used it to add a new column onto
  452. Xour matrix to make it square.
  453. X
  454. XWe can multiply these two matrices in either order to get an identity.
  455. X
  456. X@group
  457. X@example
  458. X1:  [ [ 1., 0., 0. ],     1:  [ [ 1., 0., 0. ],
  459. X      [ 0., 1., 0. ],           [ 0., 1., 0. ],
  460. X      [ 0., 0., 1. ] ]          [ 0., 0., 1. ] ]
  461. X    .                         .
  462. X
  463. X    X *                       U TAB *
  464. X@end example
  465. X@end group
  466. X
  467. XMatrix inverses are related to systems of linear equations in algebra.
  468. XSuppose we had the following set of equations:
  469. X
  470. X@group
  471. X@example
  472. X    a + 2b + 3c = 6
  473. X   4a + 5b + 6c = 2
  474. X   7a + 6b      = 3
  475. X@end example
  476. X@end group
  477. X
  478. XThis can be cast into the matrix equation,
  479. X
  480. X@group
  481. X@example
  482. X   [ [ 1, 2, 3 ],    [ [ a ],    [ [ 6 ],
  483. X     [ 4, 5, 6 ],  *   [ b ],  =   [ 2 ],
  484. X     [ 7, 6, 0 ] ]     [ c ] ]     [ 3 ] ]
  485. X@end example
  486. X@end group
  487. X
  488. XWe can solve this system of equations by multiplying both sides by the
  489. Xinverse of the matrix.  Calc can do this all in one step:
  490. X
  491. X@group
  492. X@example
  493. X2:  [6, 2, 3]          1:  [-12.6, 15.2, -3.93333]
  494. X1:  [ [ 1, 2, 3 ],         .
  495. X      [ 4, 5, 6 ],
  496. X      [ 7, 6, 0 ] ]
  497. X    .
  498. X
  499. X    [6,2,3] r 5            /
  500. X@end example
  501. X@end group
  502. X
  503. XDividing by a square matrix is equivalent to multiplying by the
  504. Xinverse.
  505. X
  506. XLet's verify this solution:
  507. X
  508. X@example
  509. X' -12.6 + 2*15.2 + 3*-3.93333
  510. X@end example
  511. X
  512. XThe result is 6.00001, reasonably correct considering that we cheated
  513. Xand didn't type all the digits of @samp{c}.
  514. X
  515. X@node List Tutorial, , Matrix Tutorial, Vector/Matrix Tutorial
  516. X@subsection Vectors as Lists
  517. X
  518. XAlthough Calc has a number of features for manipulating vectors and
  519. Xmatrices as mathematical objects, you can also treat vectors as
  520. Xsimple lists of values.  For example, we saw that the @kbd{k f}
  521. Xcommand returns a vector which is a list of the prime factors of a
  522. Xnumber.
  523. X
  524. XYou can pack and unpack stack entries into vectors:
  525. X
  526. X@group
  527. X@example
  528. X3:  10         1:  [10, 20, 30]     3:  10
  529. X2:  20             .                2:  20
  530. X1:  30                              1:  30
  531. X    .                                   .
  532. X
  533. X                M-3 v p                v u
  534. X@end example
  535. X@end group
  536. X
  537. XYou can also build vectors out of consecutive integers, or many
  538. Xcopies of a given value:
  539. X
  540. X@group
  541. X@example
  542. X1:  [1, 2, 3, 4]    2:  [1, 2, 3, 4]    2:  [1, 2, 3, 4]
  543. X    .               1:  17              1:  [17, 17, 17, 17]
  544. X                        .                   .
  545. X
  546. X   v x 4 RET            17                 v b 4 RET
  547. X@end example
  548. X@end group
  549. X
  550. XYou can apply an operator to every element of a vector using the
  551. X@dfn{map} command.
  552. X
  553. X@group
  554. X@example
  555. X1:  [17, 34, 51, 68]   1:  [289, 1156, 2601, 4624]  1:  [17, 34, 51, 68]
  556. X    .                      .                            .
  557. X
  558. X    V M *                  2 V M ^                      V M Q
  559. X@end example
  560. X@end group
  561. X
  562. XIn the first step, we multiply the vector of integers by the vector
  563. Xof 17's elementwise.  In the second step, we raise each element to
  564. Xthe power two.  (The general rule is that both operands must be
  565. Xvectors of the same length, or else one must be a vector and the
  566. Xother a plain number.)  In the final step, we take the square root
  567. Xof each element.
  568. X
  569. XYou can also @dfn{reduce} a binary operator across a vector.
  570. XFor example, reducing @samp{*} computes the product of all the
  571. Xelements in the vector:
  572. X
  573. X@group
  574. X@example
  575. X1:  123123     1:  [3, 7, 11, 13, 41]      1:  123123
  576. X    .              .                           .
  577. X
  578. X    123123         k f                         V R *
  579. X@end example
  580. X@end group
  581. X
  582. XIn this example, we decompose 123123 into its prime factors, then
  583. Xmultiply those factors together again to yield the original number.
  584. X
  585. XWe could compute a dot product ``by hand'' using mapping and
  586. Xreduction:
  587. X
  588. X@group
  589. X@example
  590. X2:  [1, 2, 3]     1:  [7, 12, 0]     1:  19
  591. X1:  [7, 6, 0]         .                  .
  592. X    .
  593. X
  594. X    r 1 r 2           V M *              V R +
  595. X@end example
  596. X@end group
  597. X
  598. XRecalling two vectors from the previous section, we compute the
  599. Xsum of pairwise products of the elements to get the same answer
  600. Xfor the dot product as before.
  601. X
  602. XAs a larger example, let's try to fit a straight line to some data,
  603. Xusing the method of least squares.  Suppose we have the following
  604. Xlist of values in a file we have loaded into Emacs:
  605. X
  606. X@example
  607. X  x        y
  608. X ---      ---
  609. X 1.34    0.234
  610. X 1.41    0.298
  611. X 1.49    0.402
  612. X 1.56    0.412
  613. X 1.64    0.466
  614. X 1.73    0.473
  615. X 1.82    0.601
  616. X 1.91    0.519
  617. X 2.01    0.603
  618. X 2.11    0.637
  619. X 2.22    0.645
  620. X 2.33    0.705
  621. X 2.45    0.917
  622. X 2.58    1.009
  623. X 2.71    0.971
  624. X 2.85    1.062
  625. X 3.00    1.148
  626. X 3.15    1.157
  627. X 3.32    1.354
  628. X@end example
  629. X
  630. XIf you are reading this tutorial in printed form, you will find it
  631. Xeasiest to press @kbd{i} to enter the on-line Info version of this
  632. Xmanual and find this table there.  (Press @kbd{g}, then type
  633. X@kbd{List Tutorial}, to jump straight to this section.)
  634. X
  635. XPosition the cursor at the upper-left corner of this table, right
  636. Xto the left of the @samp{1.34}.  Press @kbd{C-@@} to set the mark.
  637. XNow position the cursor to the lower-right, just after the @samp{1.354}.
  638. XYou have now defined this region as an Emacs ``rectangle.''  Still
  639. Xin the Info buffer, type @kbd{M-x calc-grab-region}.  This command
  640. Xwill pop you back into the Calculator, with the contents of the
  641. Xrectangle you specified in the form of a matrix.
  642. X
  643. X@group
  644. X@example
  645. X1:  [ [ 1.34, 0.234 ],
  646. X      [ 1.41, 0.298 ],
  647. X      @dots{}
  648. X@end example
  649. X@end group
  650. X
  651. XWe want to treat this as a pair of lists.  The first step is to
  652. Xtranspose this matrix into a pair of rows.  Remember, a matrix is
  653. Xjust a vector of vectors.  So we can unpack the matrix into a pair
  654. Xof row vectors on the stack.
  655. X
  656. X@group
  657. X@example
  658. X1:  [ [ 1.34,  1.41,  1.49,  ... ],    2:  [1.34, 1.41, 1.49, ... ]
  659. X      [ 0.234, 0.298, 0.402, ... ] ]   1:  [0.234, 0.298, 0.402, ... ]
  660. X    .                                      .
  661. X
  662. X    v t                                    v u
  663. X@end example
  664. X@end group
  665. X
  666. XLet's store these in quick variables 1 and 2, respectively.
  667. X
  668. X@group
  669. X@example
  670. X1:  [1.34, 1.41, 1.49, ... ]        .
  671. X    .
  672. X
  673. X    s 2 DEL                         s 1 DEL
  674. X@end example
  675. X@end group
  676. X
  677. XIn a least squares fit, the slope is given by the formula
  678. X
  679. X@example
  680. X(N sum(x y) - sum(x) sum(y)) / (N sum(x^2) - sum(x)^2)
  681. X@end example
  682. X
  683. X@noindent
  684. Xwhere @samp{sum(@var{x})} represents the sum of all the values of @var{x}.
  685. XThere is no actual @code{sum} function in Calc, but we can sum a
  686. Xvector using a simple reduction.  First, let's compute the four
  687. Xdifferent sums that this formula uses.
  688. X
  689. X@group
  690. X@example
  691. X1:  41.63                 1:  98.0003
  692. X    .                         .              
  693. X
  694. X r 1 V R +   s 3 DEL       r 1 2 V M ^ V R +   s 4 DEL
  695. X@end example
  696. X@end group
  697. X
  698. X@group
  699. X@example
  700. X1:  13.613                1:  33.36554
  701. X    .                         .
  702. X
  703. X r 2 V R +   s 5 DEL       r 1 r 2 V M * V R +   s 6 DEL
  704. X@end example
  705. X@end group
  706. X
  707. XThese are @samp{sum(x)}, @samp{sum(x^2)}, @samp{sum(y)}, and @samp{sum(x y)},
  708. Xrespectively.  Finally, we also need @samp{N}, the number of data points.
  709. XThis is just the length of either of our lists.
  710. X
  711. X@group
  712. X@example
  713. X1:  19
  714. X    .
  715. X
  716. X r 1 v l   s 7 DEL
  717. X@end example
  718. X@end group
  719. X
  720. X(That's @kbd{v} followed by a lower-case @kbd{l}.)  Now, we just grind
  721. Xthrough the formula:
  722. X
  723. X@group
  724. X@example
  725. X1:  633.94526  2:  633.94526  1:  67.23607
  726. X    .          1:  566.70919      .
  727. X                   .
  728. X
  729. X r 7 r 6 *      r 3 r 5 *         -
  730. X@end example
  731. X@end group
  732. X
  733. X@group
  734. X@example
  735. X2:  67.23607   3:  67.23607   2:  67.23607   1:  0.52141679
  736. X1:  1862.0057  2:  1862.0057  1:  128.9488       .
  737. X    .          1:  1733.0569      .
  738. X                   .
  739. X
  740. X r 7 r 4 *      r 3 2 ^           -              /   s 8 DEL
  741. X@end example
  742. X@end group
  743. X
  744. XThat's the slope @var{m}.  The intercept @var{b} can now be found with the
  745. Xsimple formula @samp{(sum(y) - @var{m} sum(x)) / N}.
  746. X
  747. X@group
  748. X@example
  749. X1:  13.613     2:  13.613     1:  -8.09358   1:  -0.425978
  750. X    .          1:  21.70658       .              .
  751. X                   .               
  752. X
  753. X   r 5            r 8 r 3 *       -              r 7 /   s 9
  754. X@end example
  755. X@end group
  756. X
  757. XLet's ``plot'' this straight line, @samp{@var{m} x + @var{b}}, and compare
  758. Xit with the original data.@refill
  759. X
  760. X@group
  761. X@example
  762. X1:  [0.699, 0.735, ... ]    1:  [0.273, 0.309, ... ]
  763. X    .                           .
  764. X
  765. X    r 1 r 8 *                   r 9 +
  766. X@end example
  767. X@end group
  768. X
  769. XNotice that multiplying a vector by a constant, and adding a constant
  770. Xto a vector, can be done without mapping commands since these are
  771. Xcommon operations from vector algebra.  As far as Calc is concerned,
  772. Xwe've just been doing geometry in 19-dimensional space!
  773. X
  774. XWe can subtract this vector from our original @samp{y} vector to get
  775. Xa feel for the error of our fit.  Let's find the maximum error:
  776. X
  777. X@group
  778. X@example
  779. X1:  [0.0387, 0.0112, ... ]   1:  [0.0387, 0.0112, ... ]   1:  0.0897
  780. X    .                            .                            .
  781. X
  782. X    r 2 -                        V M A                        V R X
  783. X@end example
  784. X@end group
  785. X
  786. XFirst we compute a vector of differences, then we take the absolute
  787. Xvalues of these differences, then we reduce the @code{max} function
  788. Xacross the vector.  (Even though @code{max} is not normally assigned
  789. Xa letter, so that you would have to type @kbd{x max} to get it,
  790. Xreducing @code{max} and @code{min} is so common that @kbd{X} and
  791. X@kbd{N} are accepted for those functions in that context.  In
  792. Xgeneral, you answer the @kbd{V M} or @kbd{V R} prompt with the
  793. Xactual key sequence that invokes the function you want.  You could
  794. Xhave typed @kbd{V R x max @key{RET}} if you had preferred.)
  795. X
  796. XAs another example, a theorem about binomial coefficients tells
  797. Xus that the alternating sum of binomial coefficients @var{n}-choose-0 minus
  798. X@var{n}-choose-1 plus @var{n}-choose-2, and so on, always comes out
  799. Xto zero.  Let's verify this for @var{n}=6.
  800. X
  801. X@group
  802. X@example
  803. X1:  [1, 2, 3, 4, 5, 6, 7]     1:  [0, 1, 2, 3, 4, 5, 6]
  804. X    .                             .
  805. X
  806. X    v x 7 RET                     1 -
  807. X@end example
  808. X@end group
  809. X
  810. X@group
  811. X@example
  812. X1:  [1, -6, 15, -20, 15, -6, 1]          1:  0
  813. X    .                                        .
  814. X
  815. X    V M ' (-1)^n choose(6,n) RET RET         V R +
  816. X@end example
  817. X@end group
  818. X
  819. XThe @kbd{V M '} command prompts you to enter any algebraic expression
  820. Xto define the function to map over the vector.  It then prompts for
  821. Xthe ``argument list'' for the function, which defaults to a list of
  822. Xevery variable that appears in the formula.  In this case, the
  823. Xdefault argument list is @samp{(n)} which is just right, so we
  824. Xsimply press @key{RET}.  The Calculator then applies this formula
  825. Xto each element of the vector, substituting each element's value for
  826. X@samp{n} in turn.
  827. X
  828. X@node Types Tutorial, Algebra Tutorial, Vector/Matrix Tutorial, Tutorial
  829. X@section Types Tutorial
  830. X
  831. XCalc understands a variety of data types as well as simple numbers.
  832. XIn this section, we'll experiment with each of these types in turn.
  833. X
  834. XThe numbers we've been using so far have mainly been either @dfn{integers}
  835. Xor @dfn{floats}.  We saw that floats are usually a good approximation to
  836. Xthe mathematical concept of real numbers, but they are only approximations
  837. Xand are susceptible to roundoff error.  Calc also supports @dfn{fractions},
  838. Xwhich can exactly represent any rational number.
  839. X
  840. X@group
  841. X@example
  842. X1:  3628800    2:  3628800    1:  518400:7   1:  518414:7   1:  7:518414
  843. X    .          1:  49             .              .              .
  844. X                   .
  845. X
  846. X    10 !           49 RET         :              2 +            &
  847. X@end example
  848. X@end group
  849. X
  850. XThe @kbd{:} command divides two integers to get a fraction; @kbd{/}
  851. Xwould normally divide integers to get a floating-point result.
  852. XNotice we had to type @key{RET} between the @kbd{49} and the @kbd{:}
  853. Xsince the @kbd{:} would otherwise be interpreted as part of a
  854. Xfraction beginning with 49.
  855. X
  856. XYou can convert between floating-point and fractional format using
  857. X@kbd{c f} and @kbd{c F}:
  858. X
  859. X@group
  860. X@example
  861. X1:  1.35027217629e-5    1:  7:518414
  862. X    .                       .
  863. X
  864. X    c f                     c F
  865. X@end example
  866. X@end group
  867. X
  868. XThe @kbd{c F} command replaces a floating-point number with the
  869. X``simplest'' fraction whose floating-point representation is the
  870. Xsame, to within the current precision.
  871. X
  872. X@group
  873. X@example
  874. X1:  3.14159265359   1:  1146408:364913   1:  3.1416   1:  355:113
  875. X    .                   .                    .            .
  876. X
  877. X    P                   c F      DEL       p 5 RET P      c F
  878. X@end example
  879. X@end group
  880. X
  881. XComplex numbers can be stored in both rectangular and polar form.
  882. X
  883. X@group
  884. X@example
  885. X1:  -9     1:  (0, 3)    1:  (3; 90.)   1:  (6; 90.)   1:  (2.4495; 45.)
  886. X    .          .             .              .              .
  887. X
  888. X    9 n        Q             c p            2 *            Q
  889. X@end example
  890. X@end group
  891. X
  892. XThe square root of -9 is by default rendered in rectangular form
  893. X(@samp{0 + 3i}), but we can convert it to polar form (3 with a
  894. Xphase angle of 90 degrees).  All the usual arithmetic and scientific
  895. Xoperations are defined on both types of complex numbers.
  896. X
  897. X@dfn{HMS forms} represent a value in terms of hours, minutes, and
  898. Xseconds.
  899. X
  900. X@group
  901. X@example
  902. X1:  2@@ 30' 0"     1:  3@@ 30' 0"     2:  3@@ 30' 0"     1:  2.
  903. X    .                 .             1:  1@@ 45' 0."        .
  904. X                                        .
  905. X
  906. X  2@@ 30' RET          1 +               RET 2 /           /
  907. X@end example
  908. X@end group
  909. X
  910. XHMS forms can also be used to hold angles in degrees, minutes, and
  911. Xseconds.
  912. X
  913. X@group
  914. X@example
  915. X1:  0.5        1:  26.56505   1:  26@@ 33' 54.18"    1:  0.44721
  916. X    .              .              .                     .
  917. X
  918. X    0.5            I T            c h                   S
  919. X@end example
  920. X@end group
  921. X
  922. XFirst we convert the inverse tangent of 0.5 to degrees-minutes-seconds
  923. Xform, then we take the sine of that angle.  Note that the trigonometric
  924. Xfunctions will accept HMS forms directly as input.
  925. X
  926. XAn @dfn{error form} represents a mean value with an attached standard
  927. Xdeviation, or error estimate.  Suppose our measurements indicate that
  928. Xa certain telephone pole is about 30 meters away, with an estimated
  929. Xerror of 1 meter, and 8 meters tall, with an estimated error of 0.2
  930. Xmeters.  What is the slope of a line from here to the top of the
  931. Xpole, and what is the equivalent angle in degrees?
  932. X
  933. X@group
  934. X@example
  935. X1:  30 +/- 1     2:  30 +/- 1     1:  3.75 +/- 0.156   1:  75.06 +/- 0.594
  936. X    .            1:  8 +/- 0.2        .                    .
  937. X                     .
  938. X
  939. X    30 p 1           8 p .2           /                   I T
  940. X@end example
  941. X@end group
  942. X
  943. XThis means that the angle is about 75 degrees, and, assuming our
  944. Xoriginal error estimates were valid standard deviations, there is about
  945. Xa 60% chance that the result is correct within 0.59 degrees.
  946. X
  947. XAn @dfn{interval form} represents a range of values.  While an
  948. Xerror form is best for making statistical estimates, intervals give
  949. Xyou exact bounds on an answer.  Suppose we additionally know that
  950. Xour telephone pole is definitely between 28 and 31 meters away,
  951. Xand that it is between 7.7 and 8.1 meters tall.
  952. X
  953. X@group
  954. X@example
  955. X1:  [28 .. 31]  2:  [28 .. 31]    1:  [3.45 .. 4.02]  1:  [73.86 .. 76.05]
  956. X    .           1:  [7.7 .. 8.1]      .                   .
  957. X                    .
  958. X
  959. X  [ 28 .. 31 ]    [ 7.7 .. 8.1 ]      /                  I T
  960. X@end example
  961. X@end group
  962. X
  963. XIf our bounds were correct, then the angle to the top of the pole
  964. Xis sure to lie in the range shown.
  965. X
  966. XThe square brackets around these intervals indicate that the endpoints
  967. Xthemselves are allowable values.  In other words, the distance to the
  968. Xtelephone pole is between 28 and 31, @emph{inclusive}.  You can also
  969. Xmake an interval that is exclusive of its endpoints by writing
  970. Xparentheses instead of square brackets.  You can even make an interval
  971. Xwhich is inclusive (``closed'') on one end and exclusive (``open'') on
  972. Xthe other.
  973. X
  974. X@group
  975. X@example
  976. X1:  [1 .. 10)    1:  (0.1 .. 1]   2:  (0.1 .. 1]   1:  (0.2 .. 3)
  977. X    .                .            1:  [2 .. 3)         .
  978. X                                      .
  979. X
  980. X  [ 1 .. 10 )        &              [ 2 .. 3 )         *
  981. X@end example
  982. X@end group
  983. X
  984. XThe Calculator automatically keeps track of which end values should
  985. Xbe open and which should be closed.
  986. X
  987. XA @dfn{modulo form} is used for performing arithmetic modulo @var{M}.
  988. XFor example, arithmetic involving time is generally done modulo 12
  989. Xor 24 hours.
  990. X
  991. X@group
  992. X@example
  993. X1:  17 mod 24    1:  3 mod 24     1:  21 mod 24    1:  9 mod 24
  994. X    .                .                .                .
  995. X
  996. X    17 M 24 RET      10 +             n                5 /
  997. X@end example
  998. X@end group
  999. X
  1000. XIn this last step, Calc has found a new number which, when multiplied
  1001. Xby 5 modulo 24, produces the original number, 21.  If @var{M} is prime
  1002. Xit is always possible to find such a number.  For non-prime @var{M}
  1003. Xlike 24, it is only sometimes possible.
  1004. X
  1005. X@group
  1006. X@example
  1007. X1:  10 mod 24    1:  16 mod 24    1:  1000000...   1:  16
  1008. X    .                .                .                .
  1009. X
  1010. X    10 M 24 RET      100 ^            10 RET 100 ^     24 %
  1011. X@end example
  1012. X@end group
  1013. X
  1014. XThese two calculations get the same answer, but the first one is
  1015. Xmuch more efficient because it avoids the huge intermediate value
  1016. Xthat arises in the second one.
  1017. X
  1018. XThe Calc data types can't be combined in all possible ways, but it
  1019. Xis possible to use HMS forms as parts of error forms, intervals,
  1020. Xmodulo forms, or as the phase part of a polar complex number.
  1021. XFor example, the @code{calc-time} command pushes the current time
  1022. Xof day on the stack as an HMS/modulo form.
  1023. X
  1024. X@group
  1025. X@example
  1026. X1:  17@@ 34' 45" mod 24@@ 0' 0"     1:  6@@ 22' 15" mod 24@@ 0' 0"
  1027. X    .                                 .
  1028. X
  1029. X    x time RET                        n
  1030. X@end example
  1031. X@end group
  1032. X
  1033. XThis calculation tells me it is six hours and 22 minutes until midnight.
  1034. X
  1035. XAnother kind of data the Calculator can manipulate is numbers with
  1036. X@dfn{units}.  This isn't strictly a new data type; it's simply an
  1037. Xapplication of algebraic expressions, where we use variables with
  1038. Xsuggestive names like @samp{cm} and @samp{in} to represent units,
  1039. Xlike centimeters and inches.
  1040. X
  1041. X@group
  1042. X@example
  1043. X1:  2 in        1:  5.08 cm      1:  0.027778 fath   1:  0.0508 m
  1044. X    .               .                .                   .
  1045. X
  1046. X    ' 2in RET       u c cm RET       u c fath RET        u b
  1047. X@end example
  1048. X@end group
  1049. X
  1050. XWe enter the quantity ``2 inches'' (actually an algebraic expression
  1051. Xwhich means two times the variable @samp{in}), then we convert it
  1052. Xfirst to centimeters, then to fathoms, then finally to ``base'' units,
  1053. Xwhich in this case means meters.
  1054. X
  1055. X@group
  1056. X@example
  1057. X1:  9 acre     1:  3 sqrt(acre)   1:  190.84 m   1:  190.84 m + 30 cm
  1058. X    .              .                  .              .
  1059. X
  1060. X ' 9 acre RET      Q                  u s            ' $+30 cm RET
  1061. X@end example
  1062. X@end group
  1063. X
  1064. X@group
  1065. X@example
  1066. X1:  191.14 m     1:  36536.3046 m^2    1:  36536046 cm^2
  1067. X    .                .                     .
  1068. X
  1069. X    u s              2 ^                   u c cgs
  1070. X@end example
  1071. X@end group
  1072. X
  1073. XSince units expressions are really just formulas, taking the square
  1074. Xroot of @samp{acre} is undefined.  After all, @code{acre} might be an
  1075. Xalgebraic variable that you will someday assign a value.  We use the
  1076. X``units-simplify'' command to simplify the expression with variables
  1077. Xbeing interpreted as unit names.
  1078. X
  1079. XIn the final step, we have converted not to a particular unit, but to a
  1080. Xunits system.  The ``cgs'' system uses centimeters instead of meters
  1081. Xas its standard unit of length.
  1082. X
  1083. XThere are a wide variety of units defined in the Calculator.
  1084. X
  1085. X@group
  1086. X@example
  1087. X1:  55 mph     1:  88.5139 kph   1:   88.5139 km / hr   1:  8.20147e-8 c
  1088. X    .              .                  .                     .
  1089. X
  1090. X ' 55 mph RET      u c kph RET        u c km/hr RET         u c c RET
  1091. X@end example
  1092. X@end group
  1093. X
  1094. XWe express a speed first in miles per hour, then in kilometers per
  1095. Xhour, then again using a slightly more explicit notation, then
  1096. Xfinally in terms of fractions of the speed of light.
  1097. X
  1098. XTemperature conversions are a bit more tricky.  There are two ways to
  1099. Xinterpret ``20 degrees Fahrenheit''---it could mean an actual
  1100. Xtemperature, or it could mean a change in temperature.  For normal
  1101. Xunits there is no difference, but temperature units have an offset
  1102. Xas well as a scale factor and so there must be two explicit commands
  1103. Xfor them.
  1104. X
  1105. X@group
  1106. X@example
  1107. X1:  20 degF       1:  11.1111 degC     1:  -20:3 degC    1:  -6.666 degC
  1108. X    .                 .                    .                 .
  1109. X
  1110. X  ' 20 degF RET       u c degC             U u t degC        c f u s
  1111. X@end example
  1112. X@end group
  1113. X
  1114. XFirst we convert a change of 20 degrees Fahrenheit into an equivalent
  1115. Xchange in degrees Celsius (or Centigrade).  Then, we convert the
  1116. Xabsolute temperature 20 degrees Fahrenheit into Celsius.  Since
  1117. Xthis comes out as an exact fraction, we then convert to floating-point,
  1118. Xwhich in turn needs a units-simplify command to figure out that
  1119. X@code{degC} does not itself need to be converted to floating-point!
  1120. X
  1121. XTo see a complete list of built-in units, type @kbd{u v}.  Press
  1122. X@kbd{M-#} again to re-enter the Calculator when you're done looking
  1123. Xat the units table.
  1124. X
  1125. X@node Algebra Tutorial, Programming Tutorial, Types Tutorial, Tutorial
  1126. X@section Algebra and Calculus Tutorial
  1127. X
  1128. XIf you enter a formula in algebraic mode that refers to variables,
  1129. Xthe formula itself is pushed onto the stack.  You can manipulate
  1130. Xformulas as regular data objects.
  1131. X
  1132. X@group
  1133. X@example
  1134. X1:  2 x^2 - 6       1:  6 - 2 x^2       1:  (6 - 2 x^2) (3 x^2 + y)
  1135. X    .                   .                   .
  1136. X
  1137. X    ' 2x^2-6 RET        n                   ' 3x^2+y RET *
  1138. X@end example
  1139. X@end group
  1140. X
  1141. XThere are also commands for doing common algebraic operations on
  1142. Xformulas.
  1143. X
  1144. X@group
  1145. X@example
  1146. X1:  18 x^2 + 6 y - 6 x^4 - 2 x^2 y    1:  (18 - 2 y) x^2 - 6 x^4 + 6 y
  1147. X    .                                     .
  1148. X
  1149. X    a x                                   a c x RET
  1150. X@end example
  1151. X@end group
  1152. X
  1153. XFirst we ``expand'' using the distributive law, then we ``collect''
  1154. Xterms involving powers of @samp{x}.
  1155. X
  1156. XLet's find the value of this expression when @samp{x} is 2 and @samp{y}
  1157. Xis one half.
  1158. X
  1159. X@group
  1160. X@example
  1161. X1:  17 x^2 - 6 x^4 + 3      1:  -25
  1162. X    .                           .
  1163. X
  1164. X    1:2 l y RET                 2 l x RET
  1165. X@end example
  1166. X@end group
  1167. X
  1168. XThe letter @kbd{l} means ``let''; it takes a number from the top of
  1169. Xthe stack and temporarily assigns it as the value of the variable
  1170. Xyou specify.  It then evaluates (as if by the @kbd{=} key) the
  1171. Xnext expression on the stack.  After this command, the variable goes
  1172. Xback to its original value, if any.
  1173. X
  1174. XLet's find the maximum value of our original expression when @samp{y}
  1175. Xis one half and @samp{x} ranges over all possible values.  We can
  1176. Xdo this by taking the derivative with respect to @samp{x} and examining
  1177. Xvalues of @samp{x} for which the derivative is zero.  If the second
  1178. Xderivative of the function at that value of @samp{x} is negative,
  1179. Xthe function has a local maximum there.
  1180. X
  1181. X@group
  1182. X@example
  1183. X1:  17 x^2 - 6 x^4 + 3      1:  34 x - 24 x^3
  1184. X    .                           .
  1185. X
  1186. X    U DEL  s 1                  a d x RET   s 2
  1187. X@end example
  1188. X@end group
  1189. X
  1190. XWell, the derivative is clearly zero when @samp{x} is zero.  To find
  1191. Xthe other root(s), let's divide through by @samp{x} and then solve:
  1192. X
  1193. X@group
  1194. X@example
  1195. X1:  (34 x - 24 x^3) / x    1:  34 x / x - 24 x^3 / x    1:  34 - 24 x^2
  1196. X    .                          .                            .
  1197. X
  1198. X    ' x RET /                  a x                          a s
  1199. X@end example
  1200. X@end group
  1201. X
  1202. X@group
  1203. X@example
  1204. X1:  34 - 24 x^2 = 0        1:  x = -1.19023
  1205. X    .                          .
  1206. X
  1207. X    0 a =  s 3                 a S x RET
  1208. X@end example
  1209. X@end group
  1210. X
  1211. XNotice the use of @kbd{a s} to ``simplify'' the formula.  When the
  1212. Xdefault algebraic simplifications don't do enough, you can use
  1213. X@kbd{a s} to tell Calc to spend more time on the job.
  1214. X
  1215. XNow we compute the second derivative and plug in our values of @samp{x}:
  1216. X
  1217. X@group
  1218. X@example
  1219. X2:  x            1:  -1.19023       2:  -1.19023        2:  -1.19023
  1220. X1:  -1.19023         .              1:  34 x - 24 x^3   1:  34 - 72 x^2
  1221. X    .                                   .                   .
  1222. X
  1223. X    v u              M-- M-2 DEL        r 2                 a d x RET  s 4
  1224. X@end example
  1225. X@end group
  1226. X
  1227. X@group
  1228. X@example
  1229. X2:  34 - 72 x^2  1:  -68.000000001  2:  34 - 72 x^2     1:  34
  1230. X1:  -1.19023         .              1:  0                   .
  1231. X    .                                   .
  1232. X
  1233. X    TAB              l x RET            U DEL 0             l x RET
  1234. X@end example
  1235. X@end group
  1236. X
  1237. X(The @kbd{v u} command can be used to pull apart any composite object,
  1238. Xnot just a vector.)
  1239. X
  1240. XThe first of these second derivatives is negative, so we know the function
  1241. Xhas a maximum value at @samp{x} = -1.19023.  (The function also has a
  1242. Xlocal @emph{minimum} at @samp{x} = 0.)
  1243. X
  1244. XWhen we solved for @samp{x}, we got only one value even though
  1245. X@samp{34 - 24 x^2 = 0} is a quadratic equation that ought to have
  1246. Xtwo solutions.  The reason is that @kbd{a S} normally returns a
  1247. Xsingle ``principal'' solution.  If it needs to come up with an
  1248. Xarbitrary sign (as occurs in the quadratic formula) it picks @samp{+}.
  1249. XIf it needs an arbitrary integer, it picks zero.  We can get a full
  1250. Xsolution by pressing @kbd{H} (the Hyperbolic flag) before @kbd{a S}.
  1251. X
  1252. X@group
  1253. X@example
  1254. X1:  34 - 24 x^2 = 0    1:  x = -1.19023 s1     1:  1.19023
  1255. X    .                      .                       .
  1256. X
  1257. X    r 3                    H a S x RET  s 5        1 n l s1 RET
  1258. X@end example
  1259. X@end group
  1260. X
  1261. XCalc has invented the variable @samp{s1} to represent an unknown sign;
  1262. Xit is supposed to be either @samp{+1} or @samp{-1}.  Here we have used
  1263. Xthe ``let'' command to evaluate the expression when the sign is negative.
  1264. XIf we plugged this into our second derivative we would get the same,
  1265. Xnegative, answer, so @samp{x} = 1.19023 is also a maximum.
  1266. X
  1267. XTo find the actual maximum value, we must plug our two values of @samp{x}
  1268. Xinto the original formula.
  1269. X
  1270. X@group
  1271. X@example
  1272. X2:  17 x^2 - 6 x^4 + 3    1:  24.08333 s1^2 - 12.04166 s1^4 + 3
  1273. X1:  -1.19023 s1               .
  1274. X    .
  1275. X
  1276. X  r 1 r 5 v u M-- M-2 DEL     l x RET
  1277. X@end example
  1278. X@end group
  1279. X
  1280. XIt's clear that this will have the same value for either sign of
  1281. X@samp{s1}, but let's work it out anyway, just for the exercise:
  1282. X
  1283. X@group
  1284. X@example
  1285. X2:  [-1, 1]              1:  [15.04166, 15.04166]
  1286. X1:  24.08333 s1^2 ...        .
  1287. X
  1288. X  [ 1 n , 1 ] TAB            V M $ RET
  1289. X@end example
  1290. X@end group
  1291. X
  1292. XHere we have used a vector mapping operation to evaluate the function
  1293. Xat several values of @samp{s1} at once.  @kbd{V M $} is like @kbd{V M '}
  1294. Xexcept that it takes the formula from the top of the stack.  The
  1295. Xformula is taken as a function to apply across the vector at the
  1296. Xnext-to-top stack level.  Once again, we press @key{RET} to use the
  1297. Xdefault argument list.
  1298. X
  1299. XIf there had been several different values, we could have used
  1300. X@kbd{V R X} to find the global maximum.
  1301. X
  1302. XWhat is the area under the portion of this curve from @samp{x} = 1 to 2?
  1303. XThis is simply the integral of the function:
  1304. X
  1305. X@group
  1306. X@example
  1307. X1:  17 x^2 - 6 x^4 + 3     1:  5.6666 x^3 - 1.2 x^5 + 3 x
  1308. X    .                          .
  1309. X
  1310. X    r 1                        a i x
  1311. X@end example
  1312. X@end group
  1313. X
  1314. XWe want to evaluate this at our two values for @samp{x} and subtract.
  1315. XOne way to do it is again with vector mapping and reduction:
  1316. X
  1317. X@group
  1318. X@example
  1319. X2:  [2, 1]            1:  [12.93333, 7.46666]    1:  5.46666
  1320. X1:  5.6666 x^3 ...        .                          .
  1321. X
  1322. X   [ 2 , 1 ] TAB          V M $ RET                  V R -
  1323. X@end example
  1324. X@end group
  1325. X
  1326. XCalc's integrator can do many simple integrals symbolically, but many
  1327. Xothers are beyond its capabilities.  Suppose we wish to find the area
  1328. Xunder the curve @samp{sin(x) ln(x)} over the same range of @samp{x}.  If
  1329. Xyou entered this formula and typed @kbd{a i x RET} (don't bother to try
  1330. Xthis), Calc would work for a long time but would be unable to find a
  1331. Xsolution.  In fact, there is no closed-form solution to this integral.
  1332. XNow what do we do?
  1333. X
  1334. XOne approach would be to do the integral numerically.  While there
  1335. Xis no built-in command for this in Calc, you can do it yourself
  1336. Xusing vector mapping and reduction.  This is rather slow, though,
  1337. Xsince the sine and logarithm functions take a long time.  We can
  1338. Xsave some time by reducing the working precision.
  1339. X
  1340. X@group
  1341. X@example
  1342. X1:  [1, 2, ... ]    1:  [10, 11, ... ]    1:  [1, 1.1, ... ]
  1343. X    .                   .                     .
  1344. X
  1345. X    v x 10 RET          9 +                   10 /
  1346. X@end example
  1347. X@end group
  1348. X
  1349. X@group
  1350. X@example
  1351. X2:  [1, 1.1, ... ]              1:  [0., 0.084941, 0.16993, ... ]
  1352. X1:  sin(x) ln(x)                    .
  1353. X    .
  1354. X
  1355. X    ' sin(x) ln(x) RET  s 1    m r  p 5 RET   V M $ RET
  1356. X@end example
  1357. X@end group
  1358. X
  1359. X@group
  1360. X@example
  1361. X1:  3.4195     0.34195
  1362. X    .          .
  1363. X
  1364. X    V R +      0.1 *
  1365. X@end example
  1366. X@end group
  1367. X
  1368. X(If you got wildly different results, did you remember to switch
  1369. Xto radians mode?)
  1370. X
  1371. XHere we have divided the curve into ten segments of equal width;
  1372. Xapproximating these segments as rectangular boxes (i.e., assuming
  1373. Xthe curve is nearly flat at that resolution), we compute the areas
  1374. Xof the boxes (height times width), then sum the areas.  (It is
  1375. Xfaster to sum first, then multiply by the width, since the width
  1376. Xis the same for every box.)
  1377. X
  1378. XThe true value of this integral turns out to be about 0.374, so
  1379. Xwe're not doing too well.  Let's try another approach.
  1380. X
  1381. X@group
  1382. X@example
  1383. X1:  sin(x) ln(x)    1:  0.84147 x - 0.84147 + 0.11957 (x - 1)^2 - ...
  1384. X    .                   .
  1385. X
  1386. X    r 1                 a t x=1 RET 4 RET
  1387. X@end example
  1388. X@end group
  1389. X
  1390. XHere we have computed the Taylor series expansion of the function
  1391. Xabout the point @samp{x=1}.  We can now integrate this polynomial
  1392. Xapproximation, since polynomials are easy to integrate.
  1393. X
  1394. X@group
  1395. X@example
  1396. X1:  0.42074 x^2 + ...    1:  [-0.0446, -0.42073]      1:  0.37613
  1397. X    .                        .                            .
  1398. X
  1399. X    a i x RET            [ 2 , 1 ] TAB  V M $ RET         V R -
  1400. X@end example
  1401. X@end group
  1402. X
  1403. XBetter!  By increasing the precision and/or asking for more terms
  1404. Xin the Taylor series, we can get a result as accurate as we like.
  1405. X
  1406. X@node Programming Tutorial, , Algebra Tutorial, Tutorial
  1407. X@section Programming Tutorial
  1408. X
  1409. XThe Calculator is written entirely in Emacs Lisp, a highly extensible
  1410. Xlanguage.  If you know Lisp, you can program the Calculator to do
  1411. Xanything you like.  But learning Lisp is too much trouble for simple
  1412. Xtasks, so we'll explore some of Calc's other, more down-to-earth
  1413. Xprogramming features here.
  1414. X
  1415. XThe simplest way to ``program'' Emacs is to define a @dfn{keyboard macro}.
  1416. XA keyboard macro is simply a sequence of keystrokes which Emacs has
  1417. Xstored away and can play back on demand.  For example, if you find
  1418. Xyourself typing @kbd{H a S x @key{RET}} often, you may wish to program
  1419. Xa keyboard macro to type this for you.
  1420. X
  1421. X@group
  1422. X@example
  1423. X1:  y = sqrt(x)          1:  x = y^2
  1424. X    .                        .
  1425. X
  1426. X    ' y=sqrt(x) RET       C-x ( H a S x RET C-x )
  1427. X
  1428. X1:  y = cos(x)           1:  x = s1 arccos(y) + 2 pi n1
  1429. X    .                        .
  1430. X
  1431. X    ' y=cos(x) RET           K
  1432. X@end example
  1433. X@end group
  1434. X
  1435. XWhen you type @kbd{C-x (}, Emacs begins recording.  But it is also
  1436. Xstill ready to execute your keystrokes, so you're really ``training''
  1437. XEmacs by walking it through the procedure once.  When you type
  1438. X@kbd{C-x )}, the macro is recorded.  You can now type @kbd{K} to
  1439. Xre-execute the same keystrokes.
  1440. X
  1441. XYou can give a name to your macro by typing @kbd{Z K}.
  1442. X
  1443. X@group
  1444. X@example
  1445. X1:  .              1:  y = x^4         1:  x = exp(pi i n1 / 2) y^0.25
  1446. X                       .                   .
  1447. X
  1448. X  Z K x RET            ' y=x^4 RET         z x
  1449. X@end example
  1450. X@end group
  1451. X
  1452. XNotice that we use shift-@kbd{Z} to define the command, and lower-case
  1453. X@kbd{z} to call it up.
  1454. X
  1455. XKeyboard macros can call other macros.
  1456. X
  1457. X@group
  1458. X@example
  1459. X1:  abs(x)        1:  x = s1 y                1:  2 / x    1:  x = 2 / y
  1460. X    .                 .                           .            .
  1461. X
  1462. X ' abs(x) RET   C-x ( ' y RET a = z x C-x )    ' 2/x RET       K
  1463. X@end example
  1464. X@end group
  1465. X
  1466. XIn many programs, some of the steps must execute several times.
  1467. XCalc has @dfn{looping} commands that allow this.  Loops are useful
  1468. Xinside keyboard macros, but actually work at any time.
  1469. X
  1470. X@group
  1471. X@example
  1472. X1:  x^6          2:  x^2        1: 360 x^2
  1473. X    .            1:  4             .
  1474. X                     .
  1475. X
  1476. X  ' x^6 RET          4        Z < a d x RET Z >
  1477. X@end example
  1478. X@end group
  1479. X
  1480. XHere we have computed the fourth derivative of @samp{x^6} by
  1481. Xenclosing a derivative command in a ``repeat loop'' structure.
  1482. XThis structure pops a repeat count from the stack, then
  1483. Xexecutes the body of the loop that many times.
  1484. X
  1485. XIf you make a mistake while entering the body of the loop,
  1486. Xtype @kbd{Z C-g} to cancel the loop command.
  1487. X
  1488. XHere's another example:
  1489. X
  1490. X@group
  1491. X@example
  1492. X3:  1               2:  10946
  1493. X2:  1               1:  17711
  1494. X1:  20                  .
  1495. X    .
  1496. X
  1497. X1 RET RET 20     Z < TAB C-j + Z >
  1498. X@end example
  1499. X@end group
  1500. X
  1501. XThe numbers in levels 2 and 1 should be the 21st and 22nd Fibonacci
  1502. Xnumbers, respectively.  (To see what's going on, try a few repetitions
  1503. Xof the loop body by hand; @kbd{C-j}, also on the Line-Feed or @key{LFD}
  1504. Xkey if you have one, pushes a copy of the number in level 2.)
  1505. X
  1506. XA fascinating property of Fibonacci numbers is that the @var{n}th
  1507. XFibonacci number can be found directly by computing @samp{phi^n / sqrt(5)}
  1508. Xand then rounding to the nearest integer, where @samp{phi}, the
  1509. X``golden ratio,'' is @samp{(1 + sqrt(5)) / 2}.
  1510. X
  1511. X@group
  1512. X@example
  1513. X1:  1.61803         1:  24476.0000409    1:  10945.9999817    1:  10946
  1514. X    .                   .                    .                    .
  1515. X
  1516. X
  1517. X1 RET 5 Q + 2 /        21 ^                 5 Q /                 R
  1518. X@end example
  1519. X@end group
  1520. X
  1521. XA more sophisticated kind of loop is the @dfn{for} loop.  Suppose
  1522. Xwe wish to compute the 20th ``harmonic'' number, which is equal to
  1523. Xthe sum of the reciprocals of the integers from 1 to 20.
  1524. X
  1525. X@group
  1526. X@example
  1527. X3:  0               1:  3.597739
  1528. X2:  1                   .
  1529. X1:  20
  1530. X    .
  1531. X
  1532. X0 RET 1 RET 20         Z ( & + 1 Z )
  1533. X@end example
  1534. X@end group
  1535. X
  1536. XThe ``for'' loop pops two numbers, the lower and upper limit, then
  1537. Xrepeats the body of the loop as an internal counter increases from
  1538. Xthe lower limit to the upper one.  Just before executing the loop
  1539. Xbody, it pushes the current loop counter.  When the loop body
  1540. Xfinishes, it pops the ``step,'' i.e., the amount by which to
  1541. Xincrement the loop counter.  As you can see, our loop always
  1542. Xuses a step of one.
  1543. X
  1544. XThis harmonic number function uses the stack to hold the running
  1545. Xtotal as well as for the various loop housekeeping functions.  If
  1546. Xyou find this disorienting, you can sum in a variable instead:
  1547. X
  1548. X@group
  1549. X@example
  1550. X1:  0         2:  1                 .                 1:  3.597739
  1551. X    .         1:  20                                      .
  1552. X                  .
  1553. X             
  1554. X 0 s 7 DEL      1 RET 20     Z ( & s + 7 DEL 1 Z )        r 7
  1555. X@end example
  1556. X@end group
  1557. X
  1558. XNotice that we have to keep hitting @key{DEL} because the store
  1559. Xcommands don't remove the value stored from the stack.  The
  1560. Xsequence @kbd{s + 7} adds the top-of-stack into the value in
  1561. Xvariable 7.
  1562. X
  1563. XOf course, if we're going to be using variables in our programs,
  1564. Xwe have to worry about the programs clobbering values that the
  1565. Xcaller was keeping in those same variables.  This is easy to
  1566. Xfix, though:
  1567. X
  1568. X@group
  1569. X@example
  1570. X    .        1:  0.6667       1:  0.6667     3:  0.6667
  1571. X                 .                .          2:  3.597739
  1572. X                                             1:  0.6667
  1573. X                                                 .
  1574. X
  1575. X   Z `    p 4 RET 2 RET 3 /   s 7 s a RET    Z '  r 7 r a RET
  1576. X@end example
  1577. X@end group
  1578. X
  1579. XWhen we type @kbd{Z `} (that's a back-quote character), Calc saves
  1580. Xits mode settings and the contents of the ten ``quick variables''
  1581. Xfor later reference.  When we type @kbd{Z '} (that's an apostrophe
  1582. Xnow), Calc restores those saved values.  Thus the @kbd{p 4} and
  1583. X@kbd{s 7} commands have no effect outside this sequence.  Wrapping
  1584. Xthis around the body of a keyboard macro ensures that it doesn't
  1585. Xinterfere with what the user of the macro was doing.  Notice that
  1586. Xthe contents of the stack, and the values of named variables,
  1587. Xsurvive past the @kbd{Z '} command.
  1588. X
  1589. XThe @dfn{Bernoulli numbers} are a sequence with the interesting
  1590. Xproperty that all of the odd Bernoulli numbers are zero, and the
  1591. Xeven ones, while difficult to compute, can be roughly approximated
  1592. Xby the formula @samp{2 n! / (2 pi)^n}.  Let's write a keyboard
  1593. Xmacro to compute (approximate) Bernoulli numbers.
  1594. X
  1595. X@group
  1596. X@example
  1597. X1:  10               1:  0.0756823
  1598. X    .                    .
  1599. X
  1600. X    10     C-x ( RET 2 % Z [ DEL 0 Z : ' 2 $! / (2 pi)^$ RET = Z ] C-x )
  1601. X@end example
  1602. X@end group
  1603. X
  1604. XYou can read @kbd{Z [} as ``then,'' @kbd{Z :} as ``else,'' and
  1605. X@kbd{Z ]} as ``end-if.''  There is no need for an explicit ``if''
  1606. Xcommand.  For the purposes of @kbd{Z [}, the condition is ``true''
  1607. Xif the value it pops from the stack is a nonzero number, or ``false''
  1608. Xif it pops zero or something that is not a number (like a formula).
  1609. XHere we take our integer argument modulo 2; this will be nonzero
  1610. Xif we're asking for an odd Bernoulli number.
  1611. X
  1612. XThe actual tenth Bernoulli number is @samp{5/66}.
  1613. X
  1614. X@group
  1615. X@example
  1616. X2:  0.0756823    1:  0          1:  0.25305    1:  0          1:  1.16659
  1617. X1:  0.0757575        .              .              .              .
  1618. X    .
  1619. X
  1620. X   5 RET 66 /   DEL DEL 11 K    DEL 12 K       DEL 13 K       DEL 14 K
  1621. X@end example
  1622. X@end group
  1623. X
  1624. XJust to exercise loops a bit more, let's compute a table of even
  1625. XBernoulli numbers.
  1626. X
  1627. X@group
  1628. X@example
  1629. X3:  []             1:  [0.10132, 0.03079, 0.02340, 0.33197, ...]
  1630. X2:  2                  .
  1631. X1:  30
  1632. X    .
  1633. X
  1634. X [ ] 2 RET 30          Z ( K | 2 Z )
  1635. X@end example
  1636. X@end group
  1637. X
  1638. XThe vertical-bar @kbd{|} is the vector-concatenation command.  When
  1639. Xwe execute it, the list we are building will be in stack level 2
  1640. X(initially this is an empty list), and the next Bernoulli number
  1641. Xwill be in level 1.  The effect is to append the Bernoulli number
  1642. Xonto the end of the list.
  1643. X
  1644. XIf you make a mistake when entering a keyboard macro, you can edit
  1645. Xit using @kbd{Z E}.  First, you must attach it to a key with @kbd{Z K}.
  1646. XOne technique is to enter a throwaway dummy definition for the macro,
  1647. Xthen enter the real one in the edit command.
  1648. X
  1649. X@group
  1650. X@example
  1651. X1:  3                   1:  17          Keyboard Macro Editor.
  1652. X    .                       .           Original keys: 1 7 RET
  1653. X
  1654. X                                        type "1\r"
  1655. X                                        type "2"
  1656. X                                        calc-plus
  1657. X
  1658. XC-x ( 1 RET 2 + C-x )    Z K h RET      Z E h
  1659. X@end example
  1660. X@end group
  1661. X
  1662. XThis shows the screen display assuming you have the @file{macedit}
  1663. Xkeyboard macro editing package installed, which is usually the case
  1664. Xsince a copy of this comes bundled with Calc.
  1665. X
  1666. XA keyboard macro is stored as a pure keystroke sequence.  The
  1667. X@file{macedit} package (invoked by @kbd{Z E}) scans along the
  1668. Xmacro and tries to decode it back into human-readable steps.
  1669. XIf a key or keys are simply shorthand for some command with a
  1670. X@kbd{M-x} name, that name is shown.  Anything that doesn't correspond
  1671. Xto a @kbd{M-x} command is written as a @samp{type} command.
  1672. X
  1673. XLet's edit in a new definition, for computing harmonic numbers.
  1674. XFirst, erase the three lines of the old definition.  Then, type
  1675. Xin the new definition (or use Emacs @kbd{M-w} and @kbd{C-y} commands
  1676. Xto copy it from the Info file).
  1677. X
  1678. X@example
  1679. Xcalc-kbd-push         # Save local values (Z `)
  1680. Xtype "0"              # Push a zero
  1681. Xcalc-store            # Store it in variable 1
  1682. Xtype "1"
  1683. Xcalc-pop              # Remove the zero from the stack
  1684. Xtype "1"              # Initial value for loop
  1685. Xcalc-roll-down        # This is the TAB key; swap initial & final
  1686. Xcalc-kbd-for          # Begin "for" loop...
  1687. Xcalc-inv              #   Take reciprocal
  1688. Xcalc-store            #   Add to accumulator
  1689. Xtype "+1"
  1690. Xcalc-pop              #   Remove from stack
  1691. Xtype "1"              #   Loop step is 1
  1692. Xcalc-kbd-end-for      # End "for" loop
  1693. Xcalc-recall           # Now recall final accumulated value
  1694. Xtype "1"
  1695. Xcalc-kbd-pop          # Restore values (Z ')
  1696. X@end example
  1697. X
  1698. XIf you don't know how to write a particular command in @file{macedit}
  1699. Xformat, you can always write it as keystrokes in a @code{type} command.
  1700. X
  1701. XPress @kbd{C-c C-c} to finish editing.
  1702. X
  1703. X@group
  1704. X@example
  1705. X1:  20         1:  3.597739
  1706. X    .              .
  1707. X
  1708. X    20             z h
  1709. X@end example
  1710. X@end group
  1711. X
  1712. X@iftex
  1713. X@chapter Calculator Basics
  1714. XThis chapter covers basic concepts such as the stack, algebraic and
  1715. Xnumeric entry, undo, numeric prefix arguments, etc.
  1716. X@end iftex
  1717. X
  1718. X@node Stack Basics, Numeric Entry, Introduction, Introduction
  1719. X@section Stack Basics
  1720. X
  1721. X@cindex Stack basics
  1722. XCalc uses RPN notation.  If you are not familar with RPN, @pxref{RPN
  1723. XTutorial}.
  1724. X
  1725. XTo add the numbers 1 and 2 in Calc you would type the keys:
  1726. X@kbd{1 @key{RET} 2 +}.
  1727. X(@key{RET} corresponds to the @key{ENTER} key on most calculators.)
  1728. XThe first three keystrokes ``push'' the numbers 1 and 2 onto the stack.  The
  1729. X@kbd{+} key always ``pops'' the top two numbers from the stack, adds them,
  1730. Xand pushes the result (3) back onto the stack.  This number is ready for
  1731. Xfurther calculations:  @kbd{5 -} pushes 5 onto the stack, then pops the
  1732. X3 and 5, subtracts them, and pushes the result (-2).@refill
  1733. X
  1734. XNote that the ``top'' of the stack actually appears at the @emph{bottom}
  1735. Xof the buffer.  A line containing a single @samp{.} character signifies
  1736. Xthe end of the buffer; Calculator commands operate on the number(s)
  1737. Xdirectly above this line.  The @kbd{d t} (@code{calc-truncate-stack})
  1738. Xcommand allows you to move the @samp{.} marker up and down in the stack;
  1739. X@pxref{Truncating the Stack}.
  1740. X
  1741. X@kindex d l
  1742. X@pindex calc-line-numbering
  1743. XStack elements are numbered consecutively, with number 1 being the top of
  1744. SHAR_EOF
  1745. echo "End of part 13"
  1746. echo "File calc.texinfo is continued in part 14"
  1747. echo "14" > s2_seq_.tmp
  1748. exit 0
  1749.